//
// Created by mio on 25-5-24.
//

#ifndef VIDEOCAPTURE_H
#define VIDEOCAPTURE_H



#include <QThread>
#include <QDebug>   // For qDebug in LogFPS
#include <QRect>    // For capture_region
#include <atomic>
#include <chrono>
#include <memory>

// 确保 AVFramePtr 和相关 FFmpeg 结构体已定义
// 通常在 AV_Common.h 中，如果不是，请确保包含了正确的 FFmpeg 头文件
#include "AV_Common.h" // 假设这里定义了 AVFramePtr

class VideoCapture : public QThread
{
    Q_OBJECT // 继承 QThread，可以添加 Q_OBJECT 以支持信号槽 (如果未来需要)

public:
    VideoCapture();

    virtual ~VideoCapture() = default; // 虚析构函数是良好基类的标志

    // 删除拷贝构造和拷贝赋值操作符
    VideoCapture(const VideoCapture&) = delete;
    VideoCapture& operator=(const VideoCapture&) = delete;

    // --- 通用接口 ---
    virtual quint32 GetWidth() const { return width_; }
    virtual quint32 GetHeight() const { return height_; }
    virtual qint64 GetTargetFramerate() const { return target_framerate_; }
    virtual void SetTargetFramerate(qint64 fps) {
        if (fps > 0) {
            target_framerate_ = fps;
        }
    }

    /**
     * @brief 初始化采集器
     * @param display_identifier 特定于实现的显示器标识符 (例如，DXGI的显示器索引，GDI可能忽略或用作其他用途)
     * @param capture_region 要捕获的区域。如果 QRect.isNull() 或无效，则应捕获整个显示器/目标。
     * @return 初始化是否成功
     */
    virtual bool Init(qint32 display_index = 0, const QRect& capture_region = QRect()) = 0;

    /**
     * @brief 关闭采集器并释放资源
     * @return 关闭是否成功
     */
    virtual bool Close() = 0;

    /**
     * @brief 捕获一帧视频数据
     * @param out_frame [out] 捕获到的视频帧 (通常应为 AV_PIX_FMT_BGRA 或 AV_PIX_FMT_RGBA 格式)
     * @return 是否成功捕获到新的一帧
     */
    virtual bool CaptureFrame(AVFramePtr& out_frame) = 0;

protected:
    // QThread 的 run 方法，派生类必须实现其采集循环
    virtual void run() override = 0;

    // --- FPS 统计辅助函数 ---
    /**
     * @brief 在派生类的 run 循环中每次成功采集一帧后调用此函数来更新和记录FPS
     */
    void LogFPS();

    /**
     * @brief 在 Init 成功或 run 循环开始时调用，以重置FPS统计的起始时间
     */
    void ResetFPSLoggingTime() {
        last_fps_log_time_ = std::chrono::steady_clock::now();
        current_fps_count_ = 0; // 同时重置计数器
    }

    // --- 共享的成员变量 ---
    std::atomic_bool stop_flag_;        // 控制线程运行的停止标志
    std::atomic_bool is_initialized_;   // 标记采集器是否已初始化

    quint32 width_;                     // 捕获画面的宽度
    quint32 height_;                    // 捕获画面的高度
    qint64  target_framerate_;          // 目标采集帧率

private:
    // FPS 统计相关
    std::atomic<int> current_fps_count_;
    std::chrono::steady_clock::time_point last_fps_log_time_;
};




#endif //VIDEOCAPTURE_H
